/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package polylifegame.model;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author epulapp
 */
public class Simulateur extends Thread {
    
    //<editor-fold defaultstate="collapsed" desc="Variables de classe">
    //Référence sur l'environnement
    private Simulable environnement;
    //Etat du Thread
    private Boolean etat;
    // Numéro du thread
    private int numThread;
     // Nombre du thread
    private int nbThread;
    // Permet de vérifier si le thread a fait un tour
    private Boolean tour;
    //</editor-fold>  

    //<editor-fold defaultstate="collapsed" desc="Constructeurs">
    /**
     * Constructeur par défaut
     */
    public Simulateur(){
        this.environnement = null;
        this.etat = false;
        this.tour = false;
    }   

    
    /**
     * Constructeur personnalisé
     * @param environnement :
     */
    public Simulateur(Simulable environnement){
        this.environnement = environnement;
        this.etat = false;
        this.tour = false;
    }
    
    /**
     * Constructeur personnalisé
     * @param environnement : Environnement courant
     * @param numero : Correspond au numéro du thread
     * @param nbThread : Correspond au nombre de thread
     */
    public Simulateur(Simulable environnement, int numero, int nbThread){
        this.environnement = environnement;
        this.etat = false;
        this.numThread = numero;
        this.nbThread = nbThread;
        this.tour = false;
    
    }
    //</editor-fold>
  
    //<editor-fold defaultstate="collapsed" desc="Méthodes de classe">
    
    /**
     * Démarer
     */
    public synchronized void play(){
            //System.out.println("Thread en start");
            this.tour = false;
            this.etat = true;
            notify();
    }
    
    /**
     * Arreter
     */
    public void pause() {
        this.etat = false;
    }
    
    /**
     * Boucle du thread
     */
    @Override
    public void run() {
        while (true) {
           synchronized(this){
                if(!this.etat){
                    try {
                        wait(); // Si l'etat est égale à true, le thread est mis en pause
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Simulateur.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } 
            }
           
            this.environnement.calculerGeneration(this.numThread, this.nbThread);
              
            tour = true;
            this.pause(); //Attente que tout les thread on terminé (Synchronisation)
            
            try {
                this.sleep(500);
            } catch (InterruptedException ex) {
                Logger.getLogger(Environnement.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    //</editor-fold>  

    //<editor-fold defaultstate="collapsed" desc="Getters et Setters">
    public Simulable getEnvironnement() {
        return environnement;
    }

    public void setEnvironnement(Simulable environnement) {
        this.environnement = environnement;
    }

    public Boolean getEtat() {
        return etat;
    }

    public void setEtat(Boolean etat) {
        this.etat = etat;
    }
    
    public Boolean getTour() {
        return tour;
    }

    public void setTour(Boolean tour) {
        this.tour = tour;
    }
    //</editor-fold>
    
}
